package 集合;

import java.util.HashMap;
import java.util.Map;

public class No447回旋镖的数量 {

    /**
     * 给定平面上 n 对不同的点，“回旋镖” 是由点表示的元组 (i, j, k) ，
     * 其中 i 和 j 之间的距离和 i 和 k 之间的距离相等（需要考虑元组的顺序）。
     * 找到所有回旋镖的数量。你可以假设 n 最大为 500，所有点的坐标在闭区间 [-10000, 10000] 中。
     * 示例:
     * 输入:
     * [[0,0],[1,0],[2,0]]
     * 输出:
     * 2
     * 解释:
     * 两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
     */

    /**
     * 题目我来解释一下,就是说给你N个点找出一个点和另外两个点距离相等的个数,
     * 以数组形式,表明有两个距离点相等那么就有两种情况,BAC,CAB;两种
     * 有三个就是6种情况,BAC*2,BAD*2,CAD*2;6种
     * 公式就是n*(n-1)
     */

    public int numberOfBoomerangs(int[][] points) {
        int count=0;
        /**
         * 切记:是以一个点为单位来计算,以一个点来算Map,不要全部算完后再算Map
         * 有点难理解
         */
        for(int i=0;i<points.length;i++){
            Map<Integer,Integer> map= new HashMap<>();
            for(int j=0;j<points.length;j++){
                if(i!=j) {
                    int dist = distance(points[i], points[j]);
                    map.put(dist, map.getOrDefault(dist, 0) + 1);
                }
            }
            for(Integer l:map.keySet()){
                Integer c = map.get(l);
                if(c>=2){
                    count+=c*(c-1);
                }
            }
        }
        return count;
    }

    //两点之间的距离: (x1-x2)^2+(y1-y2)^2
    private int distance(int[] i,int[] j){
        return ((i[0] - j[0]) * (i[0] - j[0]) + (i[1] - j[1]) * (i[1] - j[1]));
    }

}
